February 09, 2021
๋ด๊ฐ ์๊ฐํ๋ ํ ์ค ์์ฝ : on ๊ณผ emit ์ ํฐํค ํ์นด ์ด๋ค.
Tiqui-Taca barca ?
์ ์์ฆ์ ๋ฐ๋ฅด์ ๋ก๋๋ ๋ญ.. ์ญ๋๊ธ์ด๊ตฌ๋.. ๐ฑ
์ฌํผ ๊ฐ์คํ๊ณ ํํ ๋ฆฌ์ผ ์์๋๋ก ๋ฐ๋ผํด ๋ณด๋ฉด socket.io ์ ์ ๋ถ๋ ์๋ ์ง๋ผ๋ ์์ฃผ ๋ฏธ์ธํ ๊ธฐ์ด ์ ๋๋ ์ ์ ์์ง ์์๊น ๊ธฐ๋ํ๋ฉฐ (ํ์ด๋? ๋ณด๊ตฌ๊ณ์์ง์ ?๐) ๊ฐ๋ณด์ฆ์!
์ผ๋จ ๋น ๋๋ ํ ๋ฆฌ ํ๋ ๋ง๋ค๊ณ
์๋ํฐ๋ฅผ ์ด๋ ํด์ server.js ๋ฅผ ์์ฑ ์ดํ ์๋ฌด ์ฝ์๋ก๊ทธ๋ ๊ฐ๋ค ์ฐ์ด ๋๊ณ
์ ์ ํ ๋๋ ํ ๋ฆฌ๋ฅผ ํ๋ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์๋ค๊ฐ
npm init -y ๋ก package.json ์์ฑํ๊ธฐ
npm install express http cors nodemon (package.json ์์ nodemon ์ผ๋ก start ์ ์ปค๋งจ๋๋ฅผ ์ง์ ํด์ค๋ค)
const express = require('express')
const cors = require('cors')
// ? create instance of express
const app = express()
// ? allows all CORS
app.use(cors())
// ? use http with instance of express
const http = require('http').createServer(app)
const port = 3000
// ? start the server
http.listen(port, () => {
console.log(`Listening to port ${port}`)
})
๋์ด์์ ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์์ localhost:3000 ์ Cannot GET / ์ด๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ํ์ธํ ์ ์๋ค.
app.get('/', (req, res) => {
res.send('Simple GET request!๐')
})
์ด์ localhost:3000 ์ ์ ์ํ๋ฉด ์๋ต์ผ๋ก ๋ฐ์ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
socket.io ๋ฅผ ์ค์นํ๋ค. (for serverside)
npm install socket.io
๊ณต์๋ฌธ์์๋ ๋์ ์์ง๋ง socket.io ๋ฅผ ์ธ ๋๋ http ๋ชจ๋๊ณผ express ๋ชจ๋์ ํผํฉ ์ฌ์ฉํ๋ค.
server.js ๋ด์ ์๋ ์ฝ๋๋ฅผ http ๋ณ์ ์ ์ธํ ๋ถ๋ถ ์๋์๋ค ์์ฑํ๋ค.
// create socket instance with http
const io = require('socket.io')(http)
// add listeners for new connection
// ์ค์๊ฐ chat (socket) ์ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ฅผ ์ํ ํ๋ผ๋ฏธํฐ, socket
io.on('connection', socket => {
// this is socket for each user
console.log('User connected', socket.id)
// ์ด๋ฐ ํฐ๋ฏธ๋์์ ๋ณด๊ฒ ์ง๋ง ๋งค๋ฒ ์์ฒญ์๋ง๋ค socket.id ๊ฐ ๋ค๋ฅด๊ฒ ํ์ธ๋๋ค.
})
๊ฐ์ ๋ฃจํธ์ index.html ํ์ผ์ ๋ง๋ ๋ค.
<!-- socket.io-client ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ํ๋ค. body ํ๊ทธ ๋ง์ง๋ง์ ์์ฑํด์ -->
<!-- io ๋ชจ๋์ ์ ์ญ์ ๋
ธ์ถ์ํค๋ ์๋ฏธ -->
<!-- io ๋ชจ๋ ๋ด ์ธ์๋ ๋ฐฑ์๋์ ์ฃผ์-->
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io('http://localhost:3000')
</script>
์ด๋ ๊ฒ ์์ฑํ๊ณ
server.js ๋ด ์ฝ๋์ simple get request ๋ถ๋ถ์ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
// ? Create a Simple GET request
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html')
})
ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ํค๊ธฐ ์ํจ์ด๋ค. ๋ฆฌ์กํธ์์๋ ์ด๋ ๊ฒ ํ ํ์๊ฐ ์๋ค. ๋ ์๋ฆฌ
์ดํ ๋ธ๋ผ์ฐ์ (localhost:3000) ์ ์๋ก๊ณ ์นจ ํ๋ฉด์ nodemon ์ผ๋ก ์คํํ ํฐ๋ฏธ๋์ ์ ์ฌํ ์ดํด๋ณด์.
โUser connected abcdefb123456cdefgโ ๋ฑ์ ๋ฌธ๊ตฌ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ค์ ์ด์ํ ๋ฌธ์๊ฐ ๋ฐ๋ก socket.id ์ด๋ค.
index.html ๋ถ๋ถ์์ ์์ฑํ ์ฝ๋ ์์ ๋๋ฒ์งธ script ํ๊ทธ ๋ถ๋ถ ์๋์ socket.emit ์ดํ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
<script>
const socket = io('http://localhost:3000')
socket.emit('new_message', 'Hello, Socket.io!๐ค')
</script>
sending message from client, also server should listen from each client via itโs socket.
์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์์ฃผ๊ธฐ ์ํด์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ค์ด์ผ ํ๋ค.
ํ์ฌ๋ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก new_message ๋ผ๋ ํ๋ผ๋ฏธํฐ ๋ณ์๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์๋ฒ๋ก ์ ๋ฌํ๊ณ ์ ํ๋ค.
๋ฐ๋ก ์ด ๋ ์ฐ๋ ์ฝ๋๊ฐ emit ์ด๋ค! (๋ฐ์์ ์ ์ํ ๊ฒ)
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋์ผ๋, ์๋ฒ๋ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ค๋น๋ฅผ ํด์ผ ํ๋ค.
server.js ๋ด ์ฝ๋์์
io.on ์ผ๋ก ์์ํ๋ ๊ธฐ์กด ์ฝ๋ ๋ด console.log ์๋์ socket.on ์ดํ์ ์ฝ๋๋ฅผ ์ถ๊ฐํด ๋ณธ๋ค.
io.on(โconnectionโ, (socket) => {
// this is socket for each user
console.log("User connected", socket.id);
socket.on("new_message", (data) => {
console.log("Client says", data);
})
});
์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์์ฃผ๊ธฐ ์ํด์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ค์ด์ผ ํ๋ค.
๊ทธ ๋ ์ฐ๋ ์ฝ๋๊ฐ ๋ฐ๋ก on ์ด๋ค!
ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ socket ์ ๊ฐ์ ธ์์, ํด๋ผ์ด์ธํธ์์ emit ์ผ๋ก ์์ฑํ newmessage ์ ๋ณ์๋ฅผ ์ผ์น์์ผ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋ฃ๋๋ค. (newmessage)
๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ data ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋ด๊ธด ๊ฐ์ ์๋ฏธํ๋ค.
์ด์ ํด๋ผ์ด์ธํธ (๋ธ๋ผ์ฐ์ ) ๋ฅผ ์๋ก๊ณ ์นจ ํด ์ฃผ๊ณ nodemon ์ผ๋ก ์ด์ด๋์ ํฐ๋ฏธ๋์ ๋ณด๋ฉด,
โClient says Hello, Socket.io!๐คโ ๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ํ์ธ ํ ์ ์์ ๊ฒ์ด๋ค.
์ฆ, ํด๋ผ์ด์ธํธ์ ๋ฉ์์ง๋ฅผ ์๋ฒ๊ฐ ๋ฃ๊ฒ ๋ ๊ฒ์ด๋ค (ํ๋๋ ๋ค์ผ์ จ๋์? ๊ฐ์ ๋๋)
ํ์ฌ ์์ฑ๋ ์ฝ๋์์,
console.log ์๋์ io.emit ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
io.on('connection', socket => {
// this is socket for each user
console.log('User connected', socket.id) // ์ด๋ฐ ํฐ๋ฏธ๋์์ ๋ณด๊ฒ ์ง๋ง ๋งค๋ฒ ์์ฒญ์๋ง๋ค socket.id ๊ฐ ๋ค๋ฅด๊ฒ ํ์ธ๋๋ค.
socket.on('new_message', data => {
console.log('Client says', data)
// ? ์ค์ผ์ด ๊ทธ ๋ค์์ socket.io ๋ก ์ฐ๊ฒฐ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ค์๊ฒ ์๋ฒ๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ฒ ํ ๊ฒ์ด๋ค.
io.emit('new_message', 'Hello, Client๐')
})
})
์ ์ด์ ์ด๊ฑธ ํด๋ผ์ด์ธํธ๊ฐ ๋ฃ๊ฒ ํ๋ ค๋ฉด?
๋ค์ ํด๋ผ์ด์ธํธ (index.html) ๋ก ๋์๊ฐ์ .on ์ผ๋ก ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ ๋ฃ๊ฒ ๋ง๋ค์ด์ค์ผ ํ๋ค. ๊ฐ์!
์๋์ ์ธ๊ธํ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ (emit), ๋ฉ์์ง ์์ฒญ์ ๋ฃ๊ธฐ (on) ๋ผ๋ ๋ด์ฉ์ด emit ๊ณผ on ์ ํฐํค ํ์นด ๋ผ๋ ๋ง์ด ์ดํด๊ฐ ์ข ๋ ๊น์?๐
socket.on ์ ํตํด ์๋ฒ์์ ์ ๋ฌํด์ฃผ๋ ์๋ต์ ๋ฐ๋๋ค. ์์ฑํด๋ณด์.
<script>
const socket = io('http://localhost:3000')
socket.emit('new_message', 'Hello, Socket.io!๐ค')
// client will listen from server
socket.on('new_message', data => {
// localhost:3000 ํ์ด์ง ๋ด ๊ฐ๋ฐ์ ๋๊ตฌ ์ฐฝ์์ ํ์ธํด ๋ณผ ๊ฒ
console.log('Server says', data)
})
</script>
index.html ์์ ๋ ์คํฌ๋ฆฝํธ ํ๊ทธ ์ฌ์ด์ form ํ๊ทธ๋ก ์ ๋ ฅ์ฐฝ ๋ง๋ค์ด ๋์.
<form onsubmit="return sendMessage()">
<input id="message" placeholder="Enter message" />
<input type="submit" value="Send" />
</form>
๋๋ฌด ๊ธธ๋ฉด ์๋๋ฏ๋ก 2๋ถ์์ ๋ต์๋ค.๐คก